﻿//
Ext.data.JsonReader = Ext.extend(Ext.data.Reader, {
    root: '',




    readRecords: function (data) {

        if (data.metaData) {
            this.onMetaChange(data.metaData);
        }


        this.jsonData = data;

        return Ext.data.JsonReader.superclass.readRecords.call(this, data);
    },

    //将response里面的记录转换成json形式的记录
    getResponseData: function (response) {
        try {
            var data = Ext.decode(response.responseText);
        }
        catch (ex) {
            throw 'Ext.data.JsonReader.getResponseData: Unable to parse JSON returned by Server.';
        }

        if (!data) {
            throw 'Ext.data.JsonReader.getResponseData: JSON object not found';
        }

        return data;
    },


    buildExtractors: function () {
        Ext.data.JsonReader.superclass.buildExtractors.apply(this, arguments);

        if (this.root) {
            this.getRoot = this.createAccessor(this.root);
        } else {
            this.getRoot = function (root) {
                return root;
            };
        }
    },


    extractData: function (root, returnRecords) {
        var recordName = this.record,
            data = [],
            length, i;

        if (recordName) {
            length = root.length;

            for (i = 0; i < length; i++) {
                data[i] = root[i][recordName];
            }
        } else {
            data = root;
        }

        return Ext.data.JsonReader.superclass.extractData.call(this, data, returnRecords);
    },


    createAccessor: function () {
        var re = /[\[\.]/;

        //createAccessor(expr)
        return function (expr) {

            // 返回空方法（空方法返回undefined）
            if (Ext.isEmpty(expr)) {
                return Ext.emptyFn;
            }

            // 如果是方法则返回自身（返回自身的返回值）
            if (Ext.isFunction(expr)) {
                return expr;
            }

            // 如果expr中有 [ 或 .
            var i = String(expr).search(re);
            if (i >= 0) {
                return new Function('obj', 'return obj' + (i > 0 ? '.' : '') + expr); // 如果[ 或 . 在expr开头位置，则直接接obj后面，否则当作obj的属性
            }

            // 次方法返回obj对象的expr属性值
            return function (obj) {
                return obj[expr];
            };
        };
    } ()
});

Ext.data.ReaderMgr.registerType('json', Ext.data.JsonReader);